﻿#include <iostream>
#include <string>
using namespace std;
/* 对象结构型模式
1.意图
为其他对象提供一种代理以控制对这个对象的访问
2.别名
Surrogate
3.适用性
在需要用比较通用和复杂的对象指针代替简单的指针的时候，使用Proxy模式。下面是一些可以使用Proxy模式的常见情况：
a.远程代理（Remote Proxy）为一个对象在不同的地址空间提供局部代表
b.虚代理（Virtual Proxy)根据需要创建开销很大的对象。
c.保护代理（Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候
d.智能指引（Smart Reference)取代了简单的指针，它在访问对象时执行一些附加操作。它的典型用途包括：
1）对指向实际对象的引用计数，这样当该对象没有引用时，可以自动释放它（也成为Smart Pointers)
2)当第一次引用一个持久对象时，将它装入内存
3）在访问一个实际对象前，检查是否已经锁定了它，以确保其他对象不能改变它
*/
class AbstractSubject
{
public:
	virtual void BuyTicket() = 0;
};

class User :public AbstractSubject
{
public:
	void BuyTicket()
	{
		cout <<"用户购票" << endl;
	}
};
class Ctrip :public AbstractSubject
{
public:
	Ctrip(AbstractSubject* pBase):pBase(pBase){}
	void BuyTicket()
	{
		//实现间接访问User即RealSubject
		cout << "携程购票" << endl;
	}
private:
	AbstractSubject* pBase;
};
/*
int main()
{
	AbstractSubject* pBase = new User;
	pBase->BuyTicket();
	Ctrip* proxy = new Ctrip(pBase);
	proxy->BuyTicket();
	return 0;
}
*/